package com.edu.exam.entity.system.config;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 编辑会话实体类
 *
 * <p>编辑会话实体用于管理用户的编辑操作会话，支持会话的创建、锁定、超时、关闭等功能。
 * 通过会话管理可以防止多用户并发编辑冲突，提供编辑操作的事务性保证。</p>
 *
 * <p>核心功能：
 * - 会话管理：创建和管理编辑会话
 * - 锁定机制：防止多用户同时编辑同一资源
 * - 超时控制：自动清理超时会话
 * - 操作统计：记录会话中的编辑操作统计</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class EditSession {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 会话ID
     *
     * <p>编辑会话的唯一标识符，采用UUID格式生成。
     * 用于会话的唯一标识和状态管理。</p>
     */
    @Column(name = "session_id", nullable = false, length = 32, unique = true)
    private String sessionId;

    /**
     * 试卷ID
     *
     * <p>编辑试卷的唯一标识符。
     * 可选字段，用于标识会话所属的试卷。</p>
     */
    @Column(name = "paper_id", length = 32)
    private String paperId;

    /**
     * 试题ID
     *
     * <p>编辑试题的唯一标识符。
     * 可选字段，用于标识会话编辑的具体试题。</p>
     */
    @Column(name = "question_id", length = 32)
    private String questionId;

    /**
     * 会话类型
     *
     * <p>编辑会话的类型标识，用于区分不同类型的编辑会话。
     * 支持的类型包括：PAPER_EDIT（试卷编辑）、QUESTION_EDIT（试题编辑）、BATCH_EDIT（批量编辑）等。</p>
     */
    @Column(name = "session_type", nullable = false, length = 20)
    private String sessionType;

    /**
     * 会话状态
     *
     * <p>编辑会话的状态标识。
     * 支持的状态包括：ACTIVE（活跃）、LOCKED（锁定）、EXPIRED（过期）、CLOSED（关闭）等。</p>
     */
    @Column(name = "session_status", nullable = false, length = 20)
    private String sessionStatus = "ACTIVE";

    /**
     * 编辑者ID
     *
     * <p>创建会话的用户ID，关联系统用户表。
     * 用于记录会话的所有者和权限控制。</p>
     */
    @Column(name = "editor_id", nullable = false, length = 32)
    private String editorId;

    /**
     * 编辑者姓名
     *
     * <p>创建会话的用户姓名，用于显示和记录。
     * 冗余存储用户姓名，避免频繁关联查询用户表。</p>
     */
    @Column(name = "editor_name", nullable = false, length = 100)
    private String editorName;

    /**
     * 开始时间
     *
     * <p>会话开始的时间，记录会话的创建时间。
     * 用于会话的时间跟踪和超时管理。</p>
     */
    @Column(name = "start_time", nullable = false)
    private LocalDateTime startTime;

    /**
     * 结束时间
     *
     * <p>会话结束的时间，记录会话的关闭时间。
     * 可选字段，会话关闭时自动设置。</p>
     */
    @Column(name = "end_time")
    private LocalDateTime endTime;

    /**
     * 过期时间
     *
     * <p>会话的过期时间，用于自动清理超时会话。
     * 系统会自动清理超过过期时间的会话。</p>
     */
    @Column(name = "expire_time", nullable = false)
    private LocalDateTime expireTime;

    /**
     * 会话超时时间（分钟）
     *
     * <p>会话的超时时间配置，单位为分钟。
     * 默认值为30分钟，可根据不同编辑类型进行调整。</p>
     */
    @Column(name = "timeout_minutes", nullable = false)
    private Integer timeoutMinutes = 30;

    /**
     * 操作次数
     *
     * <p>会话中的编辑操作次数。
     * 用于统计会话的活跃程度。</p>
     */
    @Column(name = "operation_count", nullable = false)
    private Integer operationCount = 0;

    /**
     * 最后操作时间
     *
     * <p>会话中最后一次操作的时间。
     * 用于会话活跃性检测和超时计算。</p>
     */
    @Column(name = "last_operation_time")
    private LocalDateTime lastOperationTime;

    /**
     * 锁定资源列表
     *
     * <p>JSON格式的锁定资源标识列表。
     * 记录会话锁定的资源（试卷、试题等），防止并发编辑冲突。</p>
     */
    @Column(name = "locked_resources", columnDefinition = "TEXT")
    private String lockedResources;

    /**
     * 会话描述
     *
     * <p>编辑会话的描述信息。
     * 可选字段，用于提供会话的详细说明。</p>
     */
    @Column(name = "session_description", length = 500)
    private String sessionDescription;

    /**
     * 客户端信息
     *
     * <p>JSON格式的客户端信息，包括浏览器类型、IP地址、用户代理等。
     * 用于会话的安全监控和问题诊断。</p>
     */
    @Column(name = "client_info", columnDefinition = "TEXT")
    private String clientInfo;

    /**
     * 是否自动保存
     *
     * <p>标识会话是否启用自动保存功能。
     * true表示启用自动保存，false表示不启用。</p>
     */
    @Column(name = "is_auto_save_enabled", nullable = false)
    private Boolean isAutoSaveEnabled = false;

    /**
     * 自动保存间隔（秒）
     *
     * <p>自动保存的时间间隔，单位为秒。
     * 默认值为60秒，可根据需要调整。</p>
     */
    
    private Integer autoSaveInterval = 60;
}
